Skip to content

Conversation

@jborean93
Copy link
Collaborator

PR Summary

Fixes the logic used when getting the PSDrive DisplayRoot for network PSDrive paths to exclude null terminators.

There are no tests added because the original issue was that we ran with DEBUG mode that didn't go across the problematic code. In this case we are now testing the problematic scenario which is the more common of the two.

PR Context

Fixes: #21064

PR Checklist

Copy link
Collaborator

@iSazonov iSazonov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jborean93 Thanks for investigating the issue!

Since you removed #if Debug it would be great to add test for fallback code branch (name length > MAXPATH).

{
// exclude null terminator
uncPath = uncBuffer.Slice(0, (int)bufferSize - 1).ToString();
uncBuffer = rentedArray = ArrayPool<char>.Shared.Rent((int)bufferSize);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's a problem here if there are multiple iterations (> 2). We must return the previous array.
In my opinion, this loop is unnecessary. But if you still want to keep it, the pattern should be similar to:

                        char[]? toReturn = rentedArray;
                        uncBuffer = rentedArray = ArrayPool<char>.Shared.Rent((int)bufferSize);
                        if (toReturn is not null)
                        {
                            ArrayPool<char>.Shared.Return(toReturn);
                        }

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've updated the code to return the rented array in all cases, I've kept the loop for now but if others object I can change it again.

I've kept the loop because now it only calls the function once and shared the same logic for handling errors and how to read the output on success.

Fixes the logic used when getting the PSDrive DisplayRoot for network
PSDrive paths to exclude null terminators.
@SteveL-MSFT SteveL-MSFT added BackPort-7.4.x-Consider CommunityDay-Small A small PR that the PS team has identified to prioritize to review labels Jan 14, 2024
@pull-request-quantifier-deprecated

This PR has 32 quantified lines of changes. In general, a change size of upto 200 lines is ideal for the best PR experience!


Quantification details

Label      : Extra Small
Size       : +15 -17
Percentile : 12.8%

Total files changed: 1

Change summary by file extension:
.cs : +15 -17

Change counts above are quantified counts, based on the PullRequestQuantifier customizations.

Why proper sizing of changes matters

Optimal pull request sizes drive a better predictable PR flow as they strike a
balance between between PR complexity and PR review overhead. PRs within the
optimal size (typical small, or medium sized PRs) mean:

  • Fast and predictable releases to production:
    • Optimal size changes are more likely to be reviewed faster with fewer
      iterations.
    • Similarity in low PR complexity drives similar review times.
  • Review quality is likely higher as complexity is lower:
    • Bugs are more likely to be detected.
    • Code inconsistencies are more likely to be detected.
  • Knowledge sharing is improved within the participants:
    • Small portions can be assimilated better.
  • Better engineering practices are exercised:
    • Solving big problems by dividing them in well contained, smaller problems.
    • Exercising separation of concerns within the code changes.

What can I do to optimize my changes

  • Use the PullRequestQuantifier to quantify your PR accurately
    • Create a context profile for your repo using the context generator
    • Exclude files that are not necessary to be reviewed or do not increase the review complexity. Example: Autogenerated code, docs, project IDE setting files, binaries, etc. Check out the Excluded section from your prquantifier.yaml context profile.
    • Understand your typical change complexity, drive towards the desired complexity by adjusting the label mapping in your prquantifier.yaml context profile.
    • Only use the labels that matter to you, see context specification to customize your prquantifier.yaml context profile.
  • Change your engineering behaviors
    • For PRs that fall outside of the desired spectrum, review the details and check if:
      • Your PR could be split in smaller, self-contained PRs instead
      • Your PR only solves one particular issue. (For example, don't refactor and code new features in the same PR).

How to interpret the change counts in git diff output

  • One line was added: +1 -0
  • One line was deleted: +0 -1
  • One line was modified: +1 -1 (git diff doesn't know about modified, it will
    interpret that line like one addition plus one deletion)
  • Change percentiles: Change characteristics (addition, deletion, modification)
    of this PR in relation to all other PRs within the repository.


Was this comment helpful? 👍  :ok_hand:  :thumbsdown: (Email)
Customize PullRequestQuantifier for this repository.

@jborean93
Copy link
Collaborator Author

Since you removed #if Debug it would be great to add test for fallback code branch (name length > MAXPATH).

I would love to but seems like the underlying Win32 API WNetAddConnection3 is unable to handle paths that exceed MAX_PATH. If someone knows how to do this I'm happy to add a test but for now the current test will check the most common scenario unlike before.

@iSazonov
Copy link
Collaborator

Since you removed #if Debug it would be great to add test for fallback code branch (name length > MAXPATH).

I would love to but seems like the underlying Win32 API WNetAddConnection3 is unable to handle paths that exceed MAX_PATH. If someone knows how to do this I'm happy to add a test but for now the current test will check the most common scenario unlike before.

If Windows 10+ support long pathы the function could do the same. I do not know, but it is possible. Or it could even be added in the future.
As for test, we can use test hooks. See

public static class InternalTestHooks

@jborean93
Copy link
Collaborator Author

If Windows 10+ support long pathы the function could do the same. I do not know, but it is possible. Or it could even be added in the future.

I tested by calling the WNet API directly with both a normal and NT path prefix \\?\UNC\.... Ultimately I think the effort in setting all this up just adds further complexity for a scenario that might not even be possible.

@iSazonov
Copy link
Collaborator

If Windows 10+ support long pathы the function could do the same. I do not know, but it is possible. Or it could even be added in the future.

I tested by calling the WNet API directly with both a normal and NT path prefix \\?\UNC\.... Ultimately I think the effort in setting all this up just adds further complexity for a scenario that might not even be possible.

We should either remove the loop if this event is improbable or add a test.

@jborean93 jborean93 closed this Jan 15, 2024
@jborean93
Copy link
Collaborator Author

Someone is free to continue on with this PR if they wish to do so. I’ve got no desire to continue to work on something that most likely will continue to sit for weeks before it is even looked at by the pwsh team.

@adityapatwardhan
Copy link
Member

Removed backport label as this is not merged

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CommunityDay-Small A small PR that the PS team has identified to prioritize to review Extra Small

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Get-PSDrive returns incorrect DisplayRoot property for mounted drive letters in 7.4.1

4 participants